

extern crate rand;
pub mod mymod3;
pub mod my3entre;
pub mod my3;


pub fn mymod2_str(){
    println!("{:?}", "mymod2");
}


// 圆周率算法 随机投点法（蒙特卡洛算法）
pub fn pi_01(times:u64) -> f64 {
    let mut hit_sum:u64 = 0;// 投中的个数
    let mut x:f64 = 0.0;
    let mut y:f64 = 0.0;// x和y坐标点
    for i in (0..times) {
        // 随机得到一个坐标
        x = rand::random::<f64>();
        y = rand::random::<f64>();
        let m = (x * x) + (y * y); 
        if m <= 1.0f64 {// 判断掷入的这个点在不在在圆内
            hit_sum+=1;
            // println!("第 {:?} 次 {:?} ", i, m);
        }
        // println!("第 {:?} 次 {:?} ", i, m);
    }
    // 统计得到π的值
    let pi = (hit_sum as f64 / times as f64 * 4.0) as f64;
    println!("圆周率计算（随机投点法（蒙特卡洛算法））= {} 次 公式： ({:?} / {:?} * 4)  结果： {:?}", times, hit_sum, times, pi);
    pi
}
// 公式法
pub fn pi_02(jd:u64) ->f64 {
    let mut pi:f64 = 2.0;
    // let _jingdu = 1000;//精度控制
    for i in (1..jd).rev() { 
        pi = pi * (i as f64) / ((2 * i + 1) as f64) + (2 as f64);
        if i % 1000 == 0{
            //println!("{:?}", pi);
        }
    }
    println!("圆周率计算 公式法 {:?}", pi);
    pi
}

// 投针法 
/*这一方法的步骤是：
　　1） 取一张白纸，在上面画上许多条间距为d的平行线。
　　2） 取一根长度为l（l<d） 的针，随机地向画有平行直线的纸上掷n次，观察针与直线相交的次数，记为m
　　3）计算针与直线相交的概率．

　　18世纪，法国数学家蒲丰和勒可莱尔提出的“投针问题”，记载于布丰1777年出版的著作中：“在平面上画有一组间距为d的平行线，将一根长度为l（l<d）的针任意掷在这个平面上，求此针与平行线中任一条相交的概率。”布丰本人证明了，这个概率是 p=2l/（πd)  π为圆周率。
*/

pub fn pi_03(x:u64) -> f64{
    // let a:u32 =10000;
    // let b:u32 = 0;
    // let c:u32 = 2800;
    // let d:u32 = 0;
    // let e:u32 = 0;
    // let mut f:[u32; 2801]
    // let g:u32 = 0;;
    // for i in (b..c){
    //     f[b+=1]=a/5;
    // }
    // for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 
    // for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); 
    return 0.0f64; 
}
use std::f64; //ruat 的数学库在 f64下面
pub fn pi_04(x:u64) -> f64{
    let n:f64 = 180f64 / (x as f64);
    println!(" n {:?}", n);
    let p1:f64 = n.sin();//n.sin()计算出来的是以弧度表示的数据
    println!(" sin of n {:?}", p1);
    let pi:f64 = ((x as f64) * p1).to_degrees();// 因为之前都是弧度 这里 需要用to_degrees()方法转换 （角度）度？
    println!("f64 自带 pi 值 ： {:?}", f64::consts::PI);
    println!("公式计算法： X * sin(180 / X) : {:?} * sin(180 / {:?}) = {:?}",x, x, pi);
    pi
}

